#include "viml/debugger.h"
#include "viml/vm.h"
#include <gtest/gtest.h>

namespace viml {

class DebuggerTest : public ::testing::Test {
protected:
    VM vm_;
    Debugger debugger_{vm_};  // 在成员初始化列表中正确初始化
    
    void SetUp() override {
        // 可以在这里添加测试所需的设置代码
    }
    
    void TearDown() override {
        // 可以在这里添加测试所需的清理代码
    }
};

TEST_F(DebuggerTest, BreakpointManagement) {
    // 测试断点管理功能
    std::string filename = "test.viml";
    int line = 10;
    
    // 添加断点
    debugger_.add_breakpoint(filename, line);
    
    // 验证断点已添加
    auto breakpoints = debugger_.list_breakpoints();
    EXPECT_EQ(breakpoints.size(), 1);
    EXPECT_EQ(breakpoints[0].first, filename);
    EXPECT_EQ(breakpoints[0].second, line);
    
    // 移除断点
    debugger_.remove_breakpoint(filename, line);
    
    // 验证断点已移除
    breakpoints = debugger_.list_breakpoints();
    EXPECT_TRUE(breakpoints.empty());
}

TEST_F(DebuggerTest, StepOperations) {
    // 测试单步执行功能
    // 注意：具体的测试实现取决于调试器的具体实现
    
    // 验证可以设置单步进入模式
    EXPECT_NO_THROW(debugger_.step_into());
    
    // 验证可以设置单步跳过模式
    EXPECT_NO_THROW(debugger_.step_over());
    
    // 验证可以设置单步跳出模式
    EXPECT_NO_THROW(debugger_.step_out());
}

TEST_F(DebuggerTest, VariableAccess) {
    // 测试变量访问功能
    // 注意：具体的测试实现取决于调试器的具体实现
    
    // 验证可以获取变量值
    // 这需要在VM中设置一些变量，然后通过调试器访问
    EXPECT_NO_THROW(debugger_.get_variable("test_var"));
}

} // namespace viml